package com.zpark.table.service.impl;

import com.zpark.table.mapper.IUserMapper;
import com.zpark.table.pojo.Reservation;
import com.zpark.table.service.IUserService;
import com.zpark.table.service.exception.*;
import com.zpark.table.utils.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;

import java.util.Date;
import java.util.Locale;
import java.util.UUID;

@Service
public class IUserServiceImpl implements IUserService {

    @Autowired
    private IUserMapper userMapper;

    @Override
    public Integer addUser(Reservation user) {
        // 根据用户名查找数据
        Reservation reservation = userMapper.selectByUsername(user.getUsername());
        // 判断查询结果，如果不为null，则表示用户名已经被注册，注册失败。结果为null可以注册
        if (reservation!= null){
            // 抛出异常表示该用户名已经被注册过，注册失败
            throw new ReservationUsernameRegisteredException("用户名已经被注册，请换一个再注册!");
        }
        // 补齐数据
        user.setIsDelete(0); // 默认0未删除
        user.setCreatedUser(user.getUsername()); // 创建人
        user.setModifiedUser(user.getUsername());// 最后修改人
        user.setCreatedTime(new Date()); // 创建时间
        user.setModifiedTime(new Date());// 最后修改时间
        user.setGender(0); // 默认是男

        // 生成盐值
        user.setSalt(UUID.randomUUID().toString().toLowerCase(Locale.ROOT));
        // 密码加密
        user.setPassword(MD5Utils.encryptPassword(user.getSalt(), user.getPassword()));
        // 调用注册接口执行注册业务
        Integer row = userMapper.insertUser(user);
        // 判断用户数据是否注册成功
        if (row <= 0){
            // 注册失败
            throw new ReservationUserRegException("注册过程中发生一个不可描述的错误!");
        }
      return row;
    }

    /**
     * 用户登录
     * @param uname 用户输入的名字
     * @param pwd 用户输入的密码
     * @return 用户数据
     */
    @Override
    public Reservation userLogin(String uname, String pwd) {
        // 判断用户名和密码是否为null
        if (StringUtils.isEmpty(uname) || StringUtils.isEmpty(pwd)){
            throw new ReservationUsernameOrPwdIsEmptyException("用户名或者密码为空!");
        }
        // 调用持久层接口查询数据
        Reservation user = userMapper.selectByUsername(uname);
        // 判断查询结果是否为null
        if (user == null){
            throw new ReservationUserNotFoundException("用户不存在！");
        }
        // 对用户提交的密码进行加密处理
        String encPwd = MD5Utils.encryptPassword(user.getSalt(), pwd);
        // 判断密码是否正确
        if (!user.getPassword().equals(encPwd)){
            throw new ReservationWrongPasswordException("密码错误!");
        }
        // 做脱密处理，将盐和密码设置为空
        user.setPassword(null);
        user.setSalt(null);
        return user;
    }


    /**
     * 用户修改密码
     */

}
